-
-
Notifications
You must be signed in to change notification settings - Fork 1k
Allow GestureHandlerRootView to be manually made active
#2401
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
m-bert
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM
|
Can we expect this to be merged? It's approved after all |
|
Actually, I'm not sure if this is the best solution to this problem. I'll try to get back to it in the near future to see if I can find other approaches to this. |
|
@j-piasecki thank you for the quick response |
|
Hi still has same problem in 2024, any suggestions? thanks |
|
@j-piasecki Issue is still reproducible in Nested Tabs with "@react-navigation/material-top-tabs": "7.3.7" |
b9f236c to
ad3f731
Compare
|
As I mentioned in the previous message, this is more of a workaround than a solution, hence I changed the prop name with an Given that it will take time to make it possible to implement a proper fix, I think we can merge this as a temporary solution. Keep in mind that this API will be removed in the future, and will cause unexpected behavior when trying to reference gestures attached under different root views in gesture relations. |
packages/react-native-gesture-handler/src/specs/RNGestureHandlerRootViewNativeComponent.ts
Outdated
Show resolved
Hide resolved
...andler/android/src/main/java/com/swmansion/gesturehandler/core/GestureHandlerOrchestrator.kt
Outdated
Show resolved
Hide resolved
m-bert
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I trust you 🫣
This PR allows users to override whether a particular `GestureHandlerRootView` is enabled or not. By default, only the topmost root view would be active, allowing all gestures to interact with each other. The problem with that approach is that if any of the native views underneath called`requestDisallowInterceptTouchEvent`, all gestures would be canceled. It comes from the fact that `requestDisallowInterceptTouchEvent` calls are propagated up the view hierarchy and we expect `GestureHandlerRootView` to be relatively close to the top. The simple solution would be to add another root view underneath the view that may call `requestDisallowInterceptTouchEvent` to prevent gestures from being canceled, this, however, resulted in two problems: - the inner root view would not be enabled - after adding the option to enable it manually, both root views would start handling the event, resulting in duplicated event streams I've fixed the second problem by adding checks at the beginning of `extractGestureHandlers` and `traverseWithPointerEvents` to ensure that we're not extracting gestures attached under another enabled root view. This allows for solving the problem described in #2383. Tested on the reproduction from #2383
Description
This PR allows users to override whether a particular
GestureHandlerRootViewis enabled or not. By default, only the topmost root view would be active, allowing all gestures to interact with each other.The problem with that approach is that if any of the native views underneath called
requestDisallowInterceptTouchEvent, all gestures would be canceled. It comes from the fact thatrequestDisallowInterceptTouchEventcalls are propagated up the view hierarchy and we expectGestureHandlerRootViewto be relatively close to the top.The simple solution would be to add another root view underneath the view that may call
requestDisallowInterceptTouchEventto prevent gestures from being canceled, this, however, resulted in two problems:I've fixed the second problem by adding checks at the beginning of
extractGestureHandlersandtraverseWithPointerEventsto ensure that we're not extracting gestures attached under another enabled root view.This allows for solving the problem described in #2383.
Test plan
Tested on the reproduction from #2383